package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.sql.Date;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Calendar;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import negocio.Clase;
import negocio.ClaseControlador;
import negocio.Sala;

import javax.swing.JLabel;
import javax.swing.JTextField;

import com.toedter.calendar.JDateChooser;

import javax.swing.JButton;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.SwingConstants;

public class SalasExaminar extends JFrame {

	private JPanel contentPane;
	Salas padreSalas;
	Sala sala;
	private JTextField textField;
	JDateChooser dateChooser;
	private JButton button;
	private JTable table;
	private JScrollPane scrollPane;
	private JPanel panel;
	private DefaultTableModel model = new DefaultTableModel();
	private java.util.Date aux = new java.util.Date();
	private Date fecha=new java.sql.Date(aux.getTime());
	private Date domingo;
	private Date lunes;
	private Date martes;
	private Date miercoles;
	private Date jueves;
	private Date viernes;
	private Date sabado;
	Calendar c = Calendar.getInstance();
	private JButton button_1;
	private JButton button_2;
	private JLabel lblNewLabel;
	private ArrayList<Clase> clases;
	ArrayList<String> fila=new ArrayList<String>();
	
	

	public void llenarEncabezado()
	{
		int diaDeLaSemana= c.get(c.DAY_OF_WEEK);
		ArrayList<String> encabezado= new ArrayList<String>();
		encabezado.add("Franja horaria");
		if(diaDeLaSemana==1) //si la fecha seleccionada es domingo
		{
		
			domingo=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(domingo.toString());
			c.add(Calendar.DATE, 1);
			lunes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(lunes.toString());
			c.add(Calendar.DATE, 1);
			martes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(martes.toString());
			c.add(Calendar.DATE, 1);
			miercoles=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(miercoles.toString());
			c.add(Calendar.DATE, 1);
			jueves=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(jueves.toString());
			c.add(Calendar.DATE, 1);
			viernes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(viernes.toString());
			c.add(Calendar.DATE, 1);
			sabado=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(sabado.toString());
		}
		else if(diaDeLaSemana==2)//si la fecha seleccionada es lunes
		{
			
			c.add(Calendar.DATE, -1);
			domingo=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(domingo.toString());
			c.add(Calendar.DATE, 1);
			lunes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(lunes.toString());
			c.add(Calendar.DATE, 1);
			martes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(martes.toString());
			c.add(Calendar.DATE, 1);
			miercoles=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(miercoles.toString());
			c.add(Calendar.DATE, 1);
			jueves=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(jueves.toString());
			c.add(Calendar.DATE, 1);
			viernes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(viernes.toString());
			c.add(Calendar.DATE, 1);
			sabado=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(sabado.toString());	
		}
		
		else if(diaDeLaSemana==3)//si el dia seleccionado es martes
		{
			
			c.add(Calendar.DATE, -2);
			domingo=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(domingo.toString());
			c.add(Calendar.DATE, 1);
			lunes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(lunes.toString());
			c.add(Calendar.DATE, 1);
			martes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(martes.toString());
			c.add(Calendar.DATE, 1);
			miercoles=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(miercoles.toString());
			c.add(Calendar.DATE, 1);
			jueves=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(jueves.toString());
			c.add(Calendar.DATE, 1);
			viernes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(viernes.toString());
			c.add(Calendar.DATE, 1);
			sabado=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(sabado.toString());	
		}
		
		else if(diaDeLaSemana==4)//si el dia seleccionado es miercoles
		{
			
			c.add(Calendar.DATE, -3);
			domingo=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(domingo.toString());
			c.add(Calendar.DATE, 1);
			lunes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(lunes.toString());
			c.add(Calendar.DATE, 1);
			martes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(martes.toString());
			c.add(Calendar.DATE, 1);
			miercoles=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(miercoles.toString());
			c.add(Calendar.DATE, 1);
			jueves=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(jueves.toString());
			c.add(Calendar.DATE, 1);
			viernes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(viernes.toString());
			c.add(Calendar.DATE, 1);
			sabado=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(sabado.toString());	
		}
		
		else if(diaDeLaSemana==5)//si el dia seleccionado es jueves
		{
			
			c.add(Calendar.DATE, -4);
			domingo=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(domingo.toString());
			c.add(Calendar.DATE, 1);
			lunes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(lunes.toString());
			c.add(Calendar.DATE, 1);
			martes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(martes.toString());
			c.add(Calendar.DATE, 1);
			miercoles=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(miercoles.toString());
			c.add(Calendar.DATE, 1);
			jueves=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(jueves.toString());
			c.add(Calendar.DATE, 1);
			viernes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(viernes.toString());
			c.add(Calendar.DATE, 1);
			sabado=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(sabado.toString());	
		}
		
		else if(diaDeLaSemana==6)//si el dia seleccionado es viernes
		{
			
			c.add(Calendar.DATE, -5);
			domingo=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(domingo.toString());
			c.add(Calendar.DATE, 1);
			lunes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(lunes.toString());
			c.add(Calendar.DATE, 1);
			martes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(martes.toString());
			c.add(Calendar.DATE, 1);
			miercoles=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(miercoles.toString());
			c.add(Calendar.DATE, 1);
			jueves=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(jueves.toString());
			c.add(Calendar.DATE, 1);
			viernes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(viernes.toString());
			c.add(Calendar.DATE, 1);
			sabado=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(sabado.toString());	
		}
		
		else if(diaDeLaSemana==7)//si el dia seleccionado es sabado
		{
			
			c.add(Calendar.DATE, -6);
			domingo=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(domingo.toString());
			c.add(Calendar.DATE, 1);
			lunes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(lunes.toString());
			c.add(Calendar.DATE, 1);
			martes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(martes.toString());
			c.add(Calendar.DATE, 1);
			miercoles=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(miercoles.toString());
			c.add(Calendar.DATE, 1);
			jueves=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(jueves.toString());
			c.add(Calendar.DATE, 1);
			viernes=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(viernes.toString());
			c.add(Calendar.DATE, 1);
			sabado=new java.sql.Date(c.getTimeInMillis());
			encabezado.add(sabado.toString());	
		}
		
		model.setColumnIdentifiers(encabezado.toArray());
		table.setModel(model);
	}
	
	@SuppressWarnings("deprecation")
	public void llenarTabla()
	{
		llenarEncabezado();
		clases=ClaseControlador.getClasesPorSala(sala);
		model.setRowCount(0);
		String franjaHoraria=null;
		Time horaInicio= new Time(0,0,0);
		Time horaFin=new Time(1,0,0);
		boolean franjaCubierta=false;
		for(Integer i=0;i<24;i++) 
		{
			franjaHoraria="De "+horaInicio.toString()+" a "+horaFin.toString();
			for(int k=0; k<7;k++)
			{
				fila.add("");
			}	
			
			//ahora lleno lo que hay en cada dia, y si no hay nada pongo "disponible"
			for (Clase c:clases)
			{
				if(c.seDictaEnFecha(domingo))
				{
					int diaSemana=0;
					fila.remove(diaSemana);
					fila.add(diaSemana,"");
					for (Clase p:clases)
					{
						
						if(c.comparteFranja(p, horaInicio, horaFin)&&p.seDictaEnFecha(domingo)&& c.getId()!=p.getId())
						{
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre()+"/"+p.getCursada().getCurso().getNombre());
						}
						else if(c.ocupaFranjaHoraria(horaInicio, horaFin)&&fila.get(diaSemana).equals(""))
						{
							
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre());
						}
					}					
				}
				
				else if(c.seDictaEnFecha(lunes))
				{
					int diaSemana=1;
					for (Clase p:clases)
					{
						if(c.comparteFranja(p, horaInicio, horaFin)&&p.seDictaEnFecha(lunes)&& c.getId()!=p.getId())
						{
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre()+"/"+p.getCursada().getCurso().getNombre());
						}
						else if(c.ocupaFranjaHoraria(horaInicio, horaFin)&&fila.get(diaSemana).equals(""))
						{
							
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre());
						}
						
					}
					
				}
				
				else if(c.seDictaEnFecha(martes))
				{
					int diaSemana=2;
					for (Clase p:clases)
					{
						if(c.comparteFranja(p, horaInicio, horaFin)&&p.seDictaEnFecha(martes)&& c.getId()!=p.getId())
						{
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre()+"/"+p.getCursada().getCurso().getNombre());
						}
						else if(c.ocupaFranjaHoraria(horaInicio, horaFin)&&fila.get(diaSemana).equals(""))
						{
							
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre());
						}
					}
				}
				
				else if(c.seDictaEnFecha(miercoles))
				{
					int diaSemana=3;
					for (Clase p:clases)
					{
						if(c.comparteFranja(p, horaInicio, horaFin)&&p.seDictaEnFecha(miercoles)&& c.getId()!=p.getId())
						{
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre()+"/"+p.getCursada().getCurso().getNombre());
						}
						else if(c.ocupaFranjaHoraria(horaInicio, horaFin)&&fila.get(diaSemana).equals(""))
						{
							
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre());
						}
					}
				}
				
				else if(c.seDictaEnFecha(jueves))
				{
					int diaSemana=4;
					for (Clase p:clases)
					{
						if(c.comparteFranja(p, horaInicio, horaFin)&&p.seDictaEnFecha(jueves)&& c.getId()!=p.getId())
						{
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre()+"/"+p.getCursada().getCurso().getNombre());
						}
						else if(c.ocupaFranjaHoraria(horaInicio, horaFin)&&fila.get(diaSemana).equals(""))
						{
							
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre());
						}
					}
				}
				
				else if(c.seDictaEnFecha(viernes))
				{
					int diaSemana=5;
					for (Clase p:clases)
					{
						if(c.comparteFranja(p, horaInicio, horaFin)&&p.seDictaEnFecha(viernes)&& c.getId()!=p.getId())
						{
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre()+"/"+p.getCursada().getCurso().getNombre());
						}
						else if(c.ocupaFranjaHoraria(horaInicio, horaFin)&&fila.get(diaSemana).equals(""))
						{
							
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre());
						}
					}
				}
				
				else if(c.seDictaEnFecha(sabado))
				{
					int diaSemana=6;
					for (Clase p:clases)
					{
						if(c.comparteFranja(p, horaInicio, horaFin)&&p.seDictaEnFecha(sabado)&& c.getId()!=p.getId())
						{
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre()+"/"+p.getCursada().getCurso().getNombre());
						}
						else if(c.ocupaFranjaHoraria(horaInicio, horaFin)&&fila.get(diaSemana).equals(""))
						{
							
							fila.remove(diaSemana);
							fila.add(diaSemana,c.getCursada().getCurso().getNombre());
						}
					}
				}			
			}
			fila.add(0, franjaHoraria);
			model.addRow(fila.toArray());
			fila.clear();
			horaInicio.setHours(horaInicio.getHours()+1);;
			horaFin.setHours(horaFin.getHours()+1);
			
		}
		
		table.setModel(model);
	}
	
	
	public SalasExaminar(Salas padreSalas, Sala sala) {
		
		addWindowListener(new WindowAdapter() 
		{
			public void windowClosing(WindowEvent e){
				padreSalas.nullSalasExaminar();
				dispose();
			}
		});
		this.sala=sala;
		this.padreSalas=padreSalas;
		contentPane = new JPanel();
		dateChooser = new JDateChooser();
		dateChooser.setBounds(396, 8, 87, 20);
		dateChooser.setDate(fecha);
		contentPane.add(dateChooser);
		c.setTime(dateChooser.getDate());
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setTitle("Examinar sala");
		setBounds(100, 100, 919, 448);
		
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNumeroDeSala = new JLabel("Numero de Sala");
		lblNumeroDeSala.setBounds(10, 11, 81, 14);
		contentPane.add(lblNumeroDeSala);
		
		textField = new JTextField();
		textField.setEnabled(false);
		textField.setEditable(false);
		textField.setBounds(101, 8, 86, 20);
		contentPane.add(textField);
		textField.setColumns(10);
		Integer salaNumero=sala.getNumero();
		textField.setText(salaNumero.toString());
		
		
		
		
		JLabel lblConsultarDisponibilidadPor = new JLabel("Consultar disponibilidad por fecha");
		lblConsultarDisponibilidadPor.setBounds(209, 11, 177, 14);
		contentPane.add(lblConsultarDisponibilidadPor);
		
		button = new JButton("Salir");
		button.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				dateChooser.setDate(fecha);
				padreSalas.nullSalasExaminar();
				dispose();
			}
		});
		button.setBounds(804, 376, 89, 23);
		contentPane.add(button);
		
		panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "Disponibilidad de la sala", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setBounds(10, 76, 889, 296);
		contentPane.add(panel);
		panel.setLayout(null);
		
		scrollPane = new JScrollPane();
		scrollPane.setBounds(6, 50, 873, 235);
		panel.add(scrollPane);
		
		table = new JTable(){
		@Override
		public boolean isCellEditable(int row, int column) {
			return false;
		}
	};
		scrollPane.setViewportView(table);
		
		JLabel lblLunes = new JLabel("Domingo");
		lblLunes.setHorizontalAlignment(SwingConstants.CENTER);
		lblLunes.setBounds(142, 30, 46, 14);
		panel.add(lblLunes);
		
		JLabel label = new JLabel("Lunes");
		label.setHorizontalAlignment(SwingConstants.CENTER);
		label.setBounds(257, 30, 46, 14);
		panel.add(label);
		
		JLabel label_1 = new JLabel("Martes");
		label_1.setHorizontalAlignment(SwingConstants.CENTER);
		label_1.setBounds(358, 30, 46, 14);
		panel.add(label_1);
		
		JLabel label_2 = new JLabel("Miercoles");
		label_2.setHorizontalAlignment(SwingConstants.CENTER);
		label_2.setBounds(468, 30, 46, 14);
		panel.add(label_2);
		
		JLabel label_3 = new JLabel("Jueves");
		label_3.setHorizontalAlignment(SwingConstants.CENTER);
		label_3.setBounds(572, 30, 46, 14);
		panel.add(label_3);
		
		JLabel label_4 = new JLabel("Viernes");
		label_4.setHorizontalAlignment(SwingConstants.CENTER);
		label_4.setBounds(676, 30, 46, 14);
		panel.add(label_4);
		
		JLabel label_5 = new JLabel("Sabado");
		label_5.setHorizontalAlignment(SwingConstants.CENTER);
		label_5.setBounds(786, 30, 46, 14);
		panel.add(label_5);
		
		JButton btnActualizar = new JButton("Actualizar");
		btnActualizar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				c.setTime(dateChooser.getDate());
				llenarTabla();
				lblNewLabel.setText("Visualizando semana del "+domingo.toString()+" al "+sabado.toString());
			}
		});
		btnActualizar.setBounds(507, 5, 89, 23);
		contentPane.add(btnActualizar);
		
		button_1 = new JButton("<< Semana anterior");
		button_1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				c.add(Calendar.DATE, -7);
				llenarTabla();
				lblNewLabel.setText("Visualizando semana del "+domingo.toString()+" al "+sabado.toString());
			}
		});
		button_1.setBounds(10, 42, 142, 23);
		contentPane.add(button_1);
		
		button_2 = new JButton("Semana siguiente >>");
		button_2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				c.add(Calendar.DATE, 7);
				llenarTabla();
				lblNewLabel.setText("Visualizando semana del "+domingo.toString()+" al "+sabado.toString());
			}
		});
		button_2.setBounds(751, 42, 142, 23);
		contentPane.add(button_2);
		
		
		this.llenarTabla();
		
		lblNewLabel = new JLabel("Visualizando semana del "+domingo.toString()+" al "+sabado.toString());
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		lblNewLabel.setBounds(162, 46, 579, 14);
		contentPane.add(lblNewLabel);
	}
}
